#!/bin/bash

# Name: 段锦涛
# Desc: 移目录，建软链接
# Example: 
# Usage: 
# Update: 2023-09-20


# 有一个目录 /data/att/, 该目录下有数百个子目录
# 比如 /data/att/today, /data/att/linux
# 再深一层目录以日期命令的目录，例如 /data/att/today/20230920,
# 每天会生成一个日期新目录，由于 /data所在磁盘快满了, 
# 所以需要将老文件(一年以前的)挪到另一个目录 /old_data/att下
# 示例： mv /data/att/today/20220101 /old_data/att/today/20220101
# 挪完后，还需要做软链接
# 示例： ln -s /old_data/att/today/20220101 /data/att/today/20220101

# 要求 /data/att/ 下所有子目录都按此操作
# 脚本会每天01:00 执行一次，要确保老文件成功挪到/old_data/att之后才能做软链接


# 先定义一个 main 函数， 目的是为了后面调用函数，方便记录日志
function main()
{
	cd /data/att
	# 遍历第一层目录
	# fix me: 如果该目录下不全是目录，还有文件，使用ls找会不会有问题？
	for dir in `ls`
	do 
		# 遍历第二层目录，使用find只找当前目录下一年以前的子目录
		for dir2 in `find $dir -maxdepth 1 -type d -mtime +365`
		do
			# 将目录目录下的文件同步到/old_data/att目录下，注意-R可以自动创建目录结构
			rsync -aR $dir2/ /old_data/att/
			# 上一条命令返回值等于0，也就是上一条命令执行成功
			if [ $? -eq 0 ]
			then
				# 如果同步成功，会将/data/att下的目录删除
				rm -rf $dir2
				echo "/data/att/$dir2 移动成功"
				# 做软链接
				ln -s /old_data/att/$dir2 /data/att/$dir2 && \
				echo "data/att/dir2 成功创建软链接"
				# 创建一个空行
				echo
			else
				echo "/data/att/$dit 未移动成功"
			fi
		done
	done
}


# 调用 main 函数，并将输出写入日志里，日志每天一个
main &> /tmp/move_old_data_`date +F`.log 

<<'COMMENT'
总结：
1. 可以通过 main 函数的形式来方便定义脚本日志
2. find 可以使用 -maxdepth 定义查找目录层级
3. 脚本某行很长，可以使用 "\ + 回车" 来换行，但是本质还是一行内容
4. rsync 的 -R 选项可以自动级联创建目录层级
COMMENT